Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.06.2011, 17:04
Аватар для Finesse
Интересующийся
Отправить личное сообщение для Finesse Посмотреть профиль Найти все сообщения от Finesse
 
Регистрация: 19.01.2011
Сообщений: 18

Универсальная функция Ajax запроса
Собрав всё что нашёл я "сконструировал" следующую фунцкию:
function ajax_load(where,what) // Ajax загрузка 
{
//where - адрес скрипта или документа
//what - POST запрос
	var xml;
	if(window.ActiveXObject)
	{
		xml=new ActiveXObject("Microsoft.XMLHTTP");
	}
	else
	{
		if(window.XMLHttpRequest)
		{
			xml=new XMLHttpRequest();
		}
		else
		{
			alert('Видимо в вашем браузере не поддреживается ajax');
		}
	}

	xml.onreadystatechange = function()
	{
		if(xml.readyState != 4 || xml.readyState==0)
		{
		}
		if(xml.readyState == 4) 
		{
			if(xml.status == 200)
			{
				return xml.responseText;
			}	
			else
			{
				return false;
			}	
		} 
	}

	xml.open("POST", where, true);
	xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xml.send(what);
}

Я её промониторил, в переменную xml.responseText правильно записывается содержимое страницы, но функция не возвращает его через return. В итоге возвращается undefined. Помогите, возможна ли такая универсальная функция?
Ответить с цитированием
  #2 (permalink)  
Старый 14.06.2011, 17:08
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Finesse Посмотреть сообщение
*!*xml.open("POST", where, true);*/!*
open(method,url,async,uname,pswd)


короче, надо
xml.open("POST", where, false);



или пишите колбэки. но вам, походу, необходимо последовательное исполнение скрипта, а не асинхронное прыгание туда-сюда
Ответить с цитированием
  #3 (permalink)  
Старый 14.06.2011, 17:12
Аватар для Finesse
Интересующийся
Отправить личное сообщение для Finesse Посмотреть профиль Найти все сообщения от Finesse
 
Регистрация: 19.01.2011
Сообщений: 18

Сообщение от melky Посмотреть сообщение
open(method,url,async,uname,pswd)


короче, надо
xml.open("POST", where, false);



или пишите колбэки. но вам, походу, необходимо последовательное исполнение скрипта, а не асинхронное прыгание туда-сюда
Не помогло (

Я предполагаю, что функция завершается сама не успевая выполнить достаточно раз функцию xml.onreadystatechange (успевает вызвать 2 раза) и не находя return возвращает undefined. Может её как-то задержать можно?

Последний раз редактировалось Finesse, 14.06.2011 в 17:15.
Ответить с цитированием
  #4 (permalink)  
Старый 15.06.2011, 03:46
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

/**
 * @public
 * @return {XMLHttpRequest, ActiveXObject}
 * @param {Function} callback
 * @param {String} mode
 */
function getXmlHttpRequest(callback, mode) {

  var xhr = null;

  if (window.XMLHttpRequest !== undefined) {

    xhr = new XMLHttpRequest();

  } else if (window.ActiveXObject !== undefined) {

    xhr = new ActiveXObject('Msxml2.XMLHTTP.6.0') ||
          new ActiveXObject('Msxml2.XMLHTTP.3.0') ||
          new ActiveXObject('Microsoft.XMLHTTP');

  } else {

    throw new Error('Ajax is not supported.');

  }

  if (xhr !== null && typeof(callback) === 'function') {

    var fn = function() {

      if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 304)) {

        switch (mode) {

          case 'text':
            callback(xhr.responseText);
            break;

          case 'xml':
            callback(xhr.responseXML);
            break;

          default:
            callback();
            break;

        }

      }

    }

    xhr.onreadystatechange = fn;

  }

  return xhr;

}


Использовать вот так:
var xhr = getXmlHttpRequest(function(response) {
  alert(response);
}, 'text');

xhr.open('GET', 'path/to/your/script.php', true);
xhr.send();


Кроссбраузерность: Chrome, Safari, Firefox, Opera, IE5.5-9.0.

Последний раз редактировалось DreamTheater, 15.06.2011 в 11:16.
Ответить с цитированием
  #5 (permalink)  
Старый 15.06.2011, 03:58
Аватар для Finesse
Интересующийся
Отправить личное сообщение для Finesse Посмотреть профиль Найти все сообщения от Finesse
 
Регистрация: 19.01.2011
Сообщений: 18

Я понял почему return ничего не возвращает и доработал функцию, теперь всё нормально
function ajax_load(where,what) // Ajax загрузка 
{
	var xml;
	var t;
	if(window.ActiveXObject)
	{
		xml=new ActiveXObject("Microsoft.XMLHTTP");
	}
	else
	{
		if(window.XMLHttpRequest)
		{
			xml=new XMLHttpRequest();
		}
		else
		{
			alert('Видимо в вашем браузере не поддреживается ajax');
		}
	}

	xml.onreadystatechange = function()
	{
		if(xml.readyState != 4 || xml.readyState==0)
		{
		}
		if(xml.readyState == 4) 
		{
			if(xml.status == 200)
			{
				t = xml.responseText;
			}	
			else
			{
				t = false;
			}	
		} 
	}

	xml.open("POST", where, false);
	xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xml.send(what);
	
	if(t)
	{
		return t;
	}
	else
	{
		return false;
	}
}
Ответить с цитированием
  #6 (permalink)  
Старый 15.06.2011, 11:17
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Сообщение от Finesse Посмотреть сообщение
Я понял почему return ничего не возвращает
Потому что return пишется только один раз в самом конце функции.
Ответить с цитированием
  #7 (permalink)  
Старый 15.06.2011, 12:30
Аватар для Finesse
Интересующийся
Отправить личное сообщение для Finesse Посмотреть профиль Найти все сообщения от Finesse
 
Регистрация: 19.01.2011
Сообщений: 18

Сообщение от DreamTheater Посмотреть сообщение
Потому что return пишется только один раз в самом конце функции.
Потому что тот return действовал в пределах вложенной функкции.

P.S. Return можно поставить в любом месте функции, причём функция завершается после вывода результата.

Последний раз редактировалось Finesse, 15.06.2011 в 13:34.
Ответить с цитированием
  #8 (permalink)  
Старый 15.06.2011, 14:07
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Люди, простите конечно, но разве это универсальная функция ajax запроса? Не верю.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #9 (permalink)  
Старый 15.06.2011, 14:12
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

конечно нет.

но это он сам написал.

например,
для меня моя анимация через тэг <style>(использование CSS3, или просто анимирование элементов пачками) - идеальная анимация
Ответить с цитированием
  #10 (permalink)  
Старый 15.06.2011, 14:20
Аватар для Finesse
Интересующийся
Отправить личное сообщение для Finesse Посмотреть профиль Найти все сообщения от Finesse
 
Регистрация: 19.01.2011
Сообщений: 18

Сообщение от Nekromancer Посмотреть сообщение
Люди, простите конечно, но разве это универсальная функция ajax запроса? Не верю.
Можно ещё добавить разные параметры, например метод запроса и прокси сервер, но с помощью этой функции можно получить содержимое страницы в переменную
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прерывание ajax запроса belbek Общие вопросы Javascript 2 12.10.2010 09:45
Деление одного ajax запроса на несколько. qwerty12311 AJAX и COMET 8 05.10.2010 22:54
Проблема с событиями после ajax запроса Mirgorod AJAX и COMET 5 12.06.2010 18:24
Остановка Ajax запроса по таймауту. Phantik AJAX и COMET 0 24.02.2010 11:21
Сохранение результата ajax запроса после нажатия 'back' gregOlsen AJAX и COMET 5 18.11.2009 12:23